package cn.jtfadmin.base.lang.common.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Date;
import java.util.Objects;

/**
 * 日期和cron 表达式之间的互相转换工具;
 *
 * @author jtf
 * @author wangleichao
 * @since 0.0.1
 */
public class CronDateUtils {

    /**
     * cron 表达式格式化
     */
    private static final String CRON_DATE_FORMAT = "ss mm HH dd MM ? yyyy";

    /***
     * 日期转cron表达式
     * @param date 时间
     * @return cron类型的日期
     */
    public static String dateToCorn(Date date) {
        Objects.requireNonNull(date, "日期转cron表达式，参数日期不能为空");
        return new SimpleDateFormat(CRON_DATE_FORMAT).format(date);

    }

    /***
     * 日期转cron表达式
     * @param date 时间
     * @return cron类型的日期
     */
    public static String dateToCorn(LocalDateTime date) {
        Objects.requireNonNull(date, "日期转cron表达式，参数日期不能为空");
        return date.format(DateTimeFormatter.ofPattern(CRON_DATE_FORMAT));
    }

    /***
     * cron 转 日期
     * @param cron Quartz cron的类型的日期
     * @return Date日期
     * @throws IllegalArgumentException 当表达式错误时抛出参数异常
     */
    public static Date cronToDate(String cron) throws IllegalArgumentException {
        Objects.requireNonNull(cron, "cron表达式转日期，表达式不能为空");
        try {
            return new SimpleDateFormat(CRON_DATE_FORMAT).parse(cron);
        } catch (ParseException e) {
            throw new IllegalArgumentException(e);
        }

    }

    /***
     * cron 转 日期
     * @param cron Quartz cron的类型的日期
     * @return Date日期
     * @throws IllegalArgumentException 当表达式错误时抛出参数异常
     */

    public static LocalDateTime cronToLocalDateTime(final String cron) throws IllegalArgumentException {
        Objects.requireNonNull(cron, "cron表达式转日期，表达式不能为空");
        try {
            return LocalDateTime.parse(cron, DateTimeFormatter.ofPattern(CRON_DATE_FORMAT));
        } catch (DateTimeParseException e) {
            throw new IllegalArgumentException(e);
        }

    }


}
